package com.hexacta.hrs.services.staffing;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.vectrics.employee.Employee;
import org.vectrics.location.Location;

import com.hexacta.hrs.domain.staffing.assignment.EmployeeAssignment;
import com.hexacta.hrs.services.crud.CrudService;
import com.hexacta.hrs.services.staffing.impl.EmployeeAssignmentDTO;

/**
 * El servicio de {@link EmployeeAssignment}.
 * 
 * @author ncortinez
 */
public interface EmployeeAssignmentService extends CrudService<EmployeeAssignment> {
    /**
     * Devuelve todas las asignaciones de empleados que sean asignables a
     * proyectos.
     * 
     * @return
     */
    List<EmployeeAssignment> findAll();

    /**
     * Devuelve todas las asignaciones de empleados incluyendo empleados que no
     * sean asignables a proyectos.
     * 
     * @return
     */
    List<EmployeeAssignment> findAllIncludingNoAssignableToProjectEmployees();

    /**
     * Devuelve una lista conteniendo los recursos disponibles y sus
     * asignaciones entre las fechas dadas
     * 
     * @param timeOff
     * 
     */
    List<EmployeeAssignmentDTO> findAvailableResource(Employee selectedEmployee, Date from, Date to,
            boolean showTentative, boolean noAsignado, boolean asignadoCliente, boolean addonAvailable,
            boolean addonNotAvailable, boolean interno, boolean timeOff, String[] roles, String projectoId,
            boolean onlyElegibleAsProjectMember, Location location);

    /**
     * @param fecha
     * @return
     */
    List<EmployeeAssignment> findEndingAfter(Date fecha);

    boolean checkAssignmentByYear(String year);
    
    List<EmployeeAssignment> findAssignmentsByEmployee(Employee employee);

	boolean checkAssigmentIsCharged(EmployeeAssignment employeeAssignment);
	
	Calendar availabilityInMonths(Employee employee);
}
